﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>

//模拟实现strlen 1(计数器版本)

//size_t my_strlen1(const char* p)
//{	
//	assert(p);
//	int count = 0;//计数器
//	while (*p != '\0')
//	{
//		p++;
//		count++;
//	}
//	return count;
//}
//
////模拟实现strlen 2(函数递归版本)
//size_t my_strlen2(const char* p)
//{
//	assert(p);
//	if (*p == '\0')
//		return 0;
//	else
//		return 1 + my_strlen2(p + 1);
//}
//
////模拟实现strlen 3(指针-指针版本)
//size_t my_strlen3(const char* p)
//{
//	assert(p);
//	char* s = p;
//	while(*s != '\0')
//		s++;
//	return s - p;
//}
//
//int main() 
//{
//	char* str = "abcdefg";
//	int ret1 = my_strlen1(str);
//	int ret2 = my_strlen2(str); 
//	int ret3 = my_strlen3(str);
//	printf("%d\n", ret1);
//	printf("%d\n", ret2);
//	printf("%d\n", ret3);
//	return 0;
//}

//模拟实现strcpy

//char* my_strcpy(char* str1, char* str2)//把str2中的内容拷贝到str1中
//{
//	assert(str1 != NULL);
//	assert(str2 != NULL);
//	char* s = str1;
//	while (*str2 != '\0') {
//		*str1 = *str2;
//		str1++;
//		str2++;
//	}
//	*str1 = *str2;
//	return s;
//}
//
////优化版本
//
//char* my_strcpy(char* str1, const char* str2)
//{
//	assert(str1 != NULL);
//	assert(str2 != NULL);
//	char* s = str1;
//	while (*str1++ = *str2++)
//		;
//	return s;
//}

////模拟实现strcat函数
//char* my_strcat(char* str1,const char* str2)//把str2中的数据拼接到str1
//{
//	assert(str1 && str2);
//	char* s = str1;
//	while (*str1 != '\0')
//		str1++;
//	while (*str1++ = *str2++)
//		;
//	return s;
//}
//
//int main() 
//{
//	char str[20] = "abcdefg";
//	char* str2 = "hijklmn";
//	char* ret = my_strcat(str,str2);
//	printf("%s\n", ret);
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a[5] = { 1, 2, 3, 4, 5 };
//	int* ptr = (int*)(&a + 1);
//	printf("%d,%d", *(a + 1), *(ptr - 1));
//	return 0;
//}
//程序的结果是什么？


//在X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结果是啥？
//#include<stdio.h>

//struct Test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p = (struct Test*)0x100000;
//
//int main()
//{
//	printf("%p\n", p + 0x1);
//	printf("%p\n", (unsigned long)p + 0x1);
//	printf("%p\n", (unsigned int*)p + 0x1);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
//	int* p;
//	p = a[0];
//	printf("%d", p[0]);
//	return 0;
//}


//假设环境是x86环境，程序输出的结果是啥？
//#include <stdio.h>
//int main()
//{
//	int a[5][5];
//	int(*p)[4];
//	p = a;
//	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char* a[] = { "work","at","alibaba" };
//	char** pa = a;
//	pa++;
//	printf("%s\n", *pa);
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	char** cp[] = { c + 3,c + 2,c + 1,c };
//	char*** cpp = cp;
//	printf("%s\n", **++cpp);
//	printf("%s\n", *-- * ++cpp + 3);
//	printf("%s\n", *cpp[-2] + 3);
//	printf("%s\n", cpp[-1][-1] + 1);
//	return 0;
//}